\chapter{i386体系下的内存管理}

处理器所支持的RAM容量收到地址总线的限制，早期Intel(80386)的处理器虽然有32位地址总线，但是由于某些原因，它仅仅能够提供1G的寻址能力。
这对于现在的应用程序来说显然是不够用的。
Intel通过增加地址引脚从32位增加到了36位，使寻址能力达到了64GB， 之后Intel引入了PAE(Physical Address Extension)的机制，使得CPU的选址能力达到了这个范围。

\section{i386分页基础}
i386分页机制提供了一种从线性地址向物理地址的映射功能。
在程序试图访问线性地址时，CPU的MMU自动计算出对应的物理地址。 
这种机制是应用程序寻址空间隔离的基础。

MMU是如何计算出与线性地址对应的物理地址的呢？ 这个工作由CPU内部的MMU来完成。
简单的来说MMU完成的工作就是将一个完整的32位地址分段查表最终得到对应的物理地址。
以三级页表为例，首先我们一直全局页表(PGD)的地址保存在一个特殊寄存器CR3当中。
当给定一个32位地址的时候，我们根据31～21(共10位地址)来计算第二级页表的起始地址，直观一点用代码来表示就是

\begin{lstlisting}[language=C]
  pmd = pgd + (vaddr & 0xFFC0000) >> 22)
  pte = pmd + (vaddr & 0x003FF000 >> 12)
  paddr = *pte + vaddr & 0x00000FFF
\end{lstlisting}

物理内存地址等于对应表项存储的值, 当中由于表项是4K对齐的PTE 当中保存的其实是页的地址， 最终还要加上页内的便宜地址得到对应的物理地址。
